/**
* \file Outils.c
* \author Catalin BLAJ
* \author Vincent JACQUEMIN
* \date 17 Octobre 2013
*
* Fichier source SCase.c pour le programme du Sudoku
*/


#include "Outils.h"

unsigned logBase2(unsigned long long n)
{
	if (n == 1)
        return 0;
	else if (n == 2)
        return 1;
	else
	{
		if (ceil(sqrt((long double) n)) == floor(sqrt((long double) n)))
			return 2 * logBase2((unsigned long long) sqrt((long double) n));
		else
			return 1 + 2 * logBase2((unsigned long long) sqrt((long double) n/2));
	}
}

unsigned long long pow2(unsigned exp)
{
    /* Fonction récursive : 2 cas d'arrêt */
    if (exp == 0)
        return 1;
    else if (exp == 1)
        return 2;
    /* Fonction récursive : cas général */
    else
    {
        unsigned long long temp = pow2(exp/2);
        if (exp%2 == 0)
            return temp*temp;
        else
            return temp*temp*2;
    }
}


char* extraireSousChaine (const char* chaine, unsigned int debut, unsigned int fin)
{
    char *nouvelleChaine = NULL;

    /* On vérifie que la chaine n'est pas nulle et que le premier caractère n'est pas après le dernier */
    if ((chaine != NULL) && (debut < fin))
    {
        nouvelleChaine = malloc (sizeof (*nouvelleChaine) * (fin - debut + 2));
        if (nouvelleChaine != NULL)
        {
            unsigned i;
            for (i=debut; i<=fin; i++)
                nouvelleChaine[i-debut] = chaine[i];
            nouvelleChaine[i-debut] = '\0';
        }
        else
        {
            fprintf(stderr, "extraireSousChaine : Espace insuffisant.");
            exit (EXIT_FAILURE);
        }
    }
    return nouvelleChaine;
}


void ajouterCaractere(char* chaine, char caractere)
{
    char caractereString[2];
    sprintf(caractereString, "%c", caractere);

    strcat(chaine, caractereString);
}
